﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed

#pragma once

#include "GcmpModelInterface.h"
#include "IElement.h"
#include "NdbDataSchema.h"
#include "ElementCreationOptions.h"
#include "CollaborationScope.h"

namespace gcmp
{

    class IGraphicsStyleData;

    /// \brief 图形样式
    class GCMP_MODEL_INTERFACE_EXPORT IGraphicsStyle: public IElement
    {
        DECLARE_CLASS_WITHOUT_DATA_MEMBERS(gcmp, IGraphicsStyle, gcmp::IElement, 60C6F61C - 7EBC - 4AC4 - B245 - E567FDEB9BD4, gcmpmodelinterface)

#pragma region static methods
        /// \brief 创建图形样式
        ///
        /// \param pDocument 图形样式所在文档
        /// \param eco 图形样式的元素创建选项
        /// \return 新创建的图形样式
        static IGraphicsStyle* Create(IDocument* pDocument, ElementCreationOptions eco);

        /// \brief 创建协同图形样式
        ///
        /// 协同环境下使用，非协同环境创建失败返回空。
        /// 需要调用者指出正在创建的是项目级还是专业级对象。
        /// 使用IGraphicsStyle::Create(IDocument*, ElementCreationOptions)，等效于创建工作单元私有对象。
        ///
        /// \param pDocument 图形样式所在文档
        /// \param eco 图形样式的元素创建选项
        /// \param collaborationContext 协同基本信息，包括项目Id、影响范围(是项目级还是专业级)、专业(在scope为专业级时有效)
        /// \param targetCategoryGuid 图形样式对象的关联类别的Guid
        /// \param [out] pErrorMessage 错误信息。传入不为空，如果出错，传出错误信息；为空不传出。
        /// \return 新创建的图形样式
        static IGraphicsStyle* Create(IDocument* pDocument, ElementCreationOptions eco, 
            const CollaborationContext & collaborationContext, const Guid & targetCategoryGuid, std::wstring * pErrorMessage);

        /// \brief 创建指定影响范围的协同样式对象
        ///
        /// 需要在协同环境下调用，非协同环境创建失败返回空。
        /// 具体行为是:
        ///     1)如果sourceContext和targetContext相同，返回nullptr。
        ///     2)如果targetContext中已有相同categoryUid的样式对象，返回nullptr。
        ///     3)参照sourceContext的样式数据，在targetContext中创建样式对象。
        ///         3.1)如果被参照的样式数据不存在，返回默认样式对象
        ///
        /// \param pDocument 图形样式所在文档
        /// \param categoryUid 图形样式类别的guid
        /// \param option 图形样式的元素创建选项
        /// \param sourceContext 被参照的协同上下文，包括项目Id、协同影响范围、专业（在影响范围为CollaborationScope::Specialty时有效）
        /// \param targetContext 目标协同上下文。要求和sourceContext属于同一个项目，否则返回nullptr
        /// \param [out] pErrorMessage错误信息。传入不为空，如果出错，传出错误信息；为空不传出。
        /// \return 新创建的图像样式
        static IGraphicsStyle* CreateForScope(IDocument* pDocument, const UniIdentity& categoryUid, ElementCreationOptions option,
            const CollaborationContext & sourceContext,const CollaborationContext & targetContext,  std::wstring * pErrorMessage);


        /// \brief 获取文档中所有的图形样式
        ///
        /// \param pDoc 图形样式所在文档
        /// \return 文档中所有的图形样式
        static std::vector<IGraphicsStyle*> GetAllGraphicsStyles(IDocument* pDoc);
#pragma endregion static methods
        
    public:  
        /// \brief 使用图形样式数据的值覆盖图形样式中对应的值
        ///
        /// \param data 图形样式数据
        /// \return void
        virtual void SetGraphicsStyleData(const IGraphicsStyleData& data) = 0;

        /// \brief 从图形样式中提取图形样式数据
        /// \return 图形样式数据，保证不会是 nullptr
        virtual OwnerPtr<IGraphicsStyleData> GetGraphicsStyleData() const = 0;

        /// \brief 从图形样式中提取图形样式数据
        /// \return 图形样式数据，保证不会是 nullptr
        virtual const IGraphicsStyleData* GetGraphicsStyleDataPtr() const = 0;

        /// \brief 获取图形样式修饰的类别
        /// 
        /// 图形样式修饰的类别不允许被修改，因此不定义接口 SetTargetCategoryUid
        /// \return 类别的 UniIdentity
        virtual const UniIdentity& GetTargetCategoryUid() const = 0;

        /// \brief 设置图形样式拥有者的 id
        ///
        /// 当拥有者被销毁时，图形样式也会被销毁
        /// \param id 拥有者的 id
        /// \return void
        virtual void SetOwnerId(const ElementId& id) = 0;

        /// \brief 获取图形样式拥有者的 id
        ///
        /// 当拥有者被销毁时，图形样式也会被销毁
        /// \return 拥有者的 id
        virtual ElementId GetOwnerId() const = 0;

    public:
        /// \brief 获取Implementation Uid
        ///
        /// \return UniIdentity 返回ImplementationUid
        static UniIdentity GetImplementationUid();

        /// \brief 获取图形样式协同影响范围
        /// \return 该图形样式协同影响范围
        virtual CollaborationScope GetCollaborationScope() const = 0;

        /// \brief 获取图形样式协同专业
        ///
        /// 为空表示该图形样式协同影响范围不为专业级别
        /// \return 该图形样式协同专业
        virtual const std::wstring& GetCollaborationSpecialty() const = 0;
    };
}




